﻿using System;
using System.Diagnostics.Contracts;
using IMModel.Domain.Common;

namespace IMModel.Domain
{
    /// <summary>
    /// Показатель в периоде
    /// </summary>
    partial class CharacteristicTerm : IRespondentIndexVector, ICacheble, IItem
    {
        private IVolumes<CharacteristicTerm> _gradationVolumesResolver;

        ///// <summary>
        ///// Получает объёмы показателей респондентов
        ///// </summary>
        //public RespondentIndexCollection RespondentVolumes
        //{
        //    get
        //    {
        //        CalcVolumes();
        //        return _respondentVolumesCache;
        //    }
        //}

        /// <summary>
        /// Получает ссылку на объект типа CharacteristicTerm, в замен которого был введён данный показатель.         
        /// </summary>
        public CharacteristicTerm InsteadOf
        {
            get { return CharacteristicTerm1; }
        }

        /// <summary>
        /// Получает признак того, что данный показатель является оценкой деятельности респондента
        /// </summary>       
        public bool IsMark
        {
            get { return Characteristic.IsMark; }
        }

        partial void OnLoaded()
        {
            Contract.Requires(_gradationVolumesResolver == null);
            Contract.Ensures(_gradationVolumesResolver != null);

            switch (IDCharacteristic)
            {
                case DomainConstants.CharacteristicIdOrder111:
                    _gradationVolumesResolver = GradationVolumeFunctionOrder111.Instance; break;
                case DomainConstants.CharacteristicIdOrderIC:
                    _gradationVolumesResolver = GradationVolumeFunctionOrderIC.Instance; break;
                case DomainConstants.CharacteristicIdOrderSponsor:
                    _gradationVolumesResolver = GradationVolumeFunctionOrderSponsor.Instance; break;

                default: _gradationVolumesResolver = DefaultGradationVolumeFunction.Instance; break;
            }
        }


        internal RespondentIndexCollection GetTermVolumes(IndexContext сontext,
            CharacteristicTerm characteristicTerm, Term term)
        {
            return _gradationVolumesResolver.GetVolumes(сontext, characteristicTerm, term);
        }

        ///// <summary>
        ///// Получает вектор объёмов показателей без учёта объёмов предыдущих лет (показателей экстра-класса)
        ///// </summary>
        //public RespondentIndexCollection ShallowVolumes
        //{
        //    get
        //    {
        //        return GetTermVolumes(this, Term);
        //    }
        //}

        /// <summary>
        /// Проверяет, действуют ли объёмы этого показателя в указанном периоде
        /// </summary>
        /// <param name="term">Период</param>
        /// <returns>Истина, если объёмы показателя требуется учитывать в заданном пероде</returns>
        public bool IsValidInPeriod(Term term)
        {
            Contract.Requires(term != null);
            int sub = VolumeValidPeriod - (term.Order - Term.Order);
            return sub >= 1;
        }


        //private void CalcVolumes()
        //{
        //    Contract.Ensures(_respondentVolumesCache != null);          
        //    if (_respondentVolumesCache != null) return;
        //    _respondentIndexCache =  _gradationVolumesResolver.GetVolumes()
        //}


        public IItem Parent
        {
            get { return CategorySectionTerm; }
        }

        public System.Collections.Generic.IEnumerable<IItem> Items
        {
            get { throw new InvalidOperationException("Операция получения дочерних пунктов для показателя не поддерживается."); }
        }
    }
}